package com.note.app.service;

import com.note.app.dto.MobileLoginDTO;
import com.note.app.dto.MobileRegisterDTO;
import com.note.app.dto.UserDTO;
import com.note.app.dto.UserLoginDTO;
import com.note.app.dto.UserRegisterDTO;
import com.note.app.dto.UserUpdateDTO;
import com.note.app.dto.VerificationCodeDTO;
import com.note.common.domain.UserToken;
import com.note.common.vo.ResponseVo;

import java.util.List;

/**
 * 用户服务接口
 * 定义用户相关的业务方法
 */
public interface UserService {

    /**
     * 用户注册
     * 
     * @param registerDTO 注册信息
     * @return 注册结果
     */
    ResponseVo<Void> register(UserRegisterDTO registerDTO);
    
    /**
     * 手机号验证码注册
     * 
     * @param registerDTO 手机注册信息
     * @return 注册结果，包含用户信息和token
     */
    ResponseVo<UserDTO> mobileRegister(MobileRegisterDTO registerDTO);

    /**
     * 用户登录
     * 
     * @param loginDTO 登录信息
     * @return 登录结果，包含用户信息和token
     */
    ResponseVo<UserDTO> login(UserLoginDTO loginDTO);
    
    /**
     * 手机号验证码登录
     * 
     * @param mobileLoginDTO 手机登录信息
     * @return 登录结果，包含用户信息和token
     */
    ResponseVo<UserDTO> mobileLogin(MobileLoginDTO mobileLoginDTO);
    
    /**
     * 发送验证码
     * 
     * @param verificationCodeDTO 手机号和验证码类型
     * @return 操作结果
     */
    ResponseVo<Void> sendVerificationCode(VerificationCodeDTO verificationCodeDTO);

    /**
     * 根据用户ID获取用户信息
     * 
     * @param userId 用户ID
     * @return 用户信息
     */
    ResponseVo<UserDTO> getUserById(Long userId);
    
    /**
     * 根据用户ID获取用户公开信息
     * 不包含密码、邮箱等敏感信息
     * 
     * @param userId 用户ID
     * @return 用户公开信息
     */
    ResponseVo<UserDTO> getUserPublicInfo(Long userId);

    /**
     * 更新用户信息（通过用户ID）
     * 
     * @param updateDTO 更新信息
     * @param userId 用户ID
     * @return 更新结果
     */
    ResponseVo<Void> updateUser(UserUpdateDTO updateDTO, Long userId);

    /**
     * 用户注销（通过用户ID）
     * 
     * @param userId 用户ID
     * @return 注销结果
     */
    ResponseVo<Void> logout(Long userId);

    /**
     * 验证Token是否有效
     *
     * @param userId 用户ID
     * @param token  Token内容
     * @return 是否有效
     */
    boolean validateToken(Long userId, String token);

    /**
     * 根据用户ID获取用户名
     *
     * @param userId 用户ID
     * @return 用户名
     */
    String getUsernameById(Long userId);

    /**
     * 根据用户ID获取头像
     *
     * @param userId 用户ID
     * @return 头像URL
     */
    String getUserAvatarById(Long userId);
} 